package com.sgcc.pda.hzaidl.impl;


import com.sgcc.pda.hw.ICommonUtilManager;
import com.sgcc.pda.hw.MeterAuthorityInfo;
import com.sgcc.pda.hw.ReturnResult;

import com.sgcc.pda.hw.SecurityUnitRegisterInfo;
import com.sgcc.pda.tools.JsonUtils;


import org.json.JSONException;
import org.json.JSONObject;

/**
 * @创建者：suven on 2019/12/16 19:39
 * @描述：
 * @版本：1.0
 * @修改人：
 * @修改时间：
 * @修改说明：
 * @修改版本：
 */
public class CommonUtilManager extends ICommonUtilManager.Stub {

    private static CommonUtilManager mInstance;

    /**
     * 单例
     *
     * @return
     */
    public static synchronized CommonUtilManager getInstance() {
        if (mInstance == null) {
            mInstance = new CommonUtilManager();
        }
        return mInstance;
    }

    /**
     * 注册安全单元信息
     *
     * @param securityUnitRegister 安全单元注册的信息
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:操作员编号
     * 1:操作员权限
     * 2:掩码信息
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    @Override
    public ReturnResult securityRegisterInfo(SecurityUnitRegisterInfo securityUnitRegister) {
        return HardWareUtil.requestHardwareData("unit1Complex_securityRegisterInfo", JsonUtils.toJson(securityUnitRegister));
    }

    /**
     * 电表注册权限信息
     *
     * @param meterAuthorityInfo 表的权限信息
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    @Override
    public ReturnResult meterRegisterAuthInfo(MeterAuthorityInfo meterAuthorityInfo) {
        return HardWareUtil.requestHardwareData("unit1Complex_meterRegisterAuthInfo", JsonUtils.toJson(meterAuthorityInfo));
    }

    /**
     * 电表进行红外身份认证（使用之前先进行调用meterRegisterAuthInfo注册红外相关权限）
     *
     * @param meterAddress 表地址
     * @param keyType      密钥类型 00公钥 01私钥
     * @param operator     操作员编号
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    @Override
    public ReturnResult infraIdentity(String meterAddress, String keyType, String operator) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("keyType", keyType);
            jb.put("operator", operator);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit1Complex_infraIdentity", jb.toString());
    }

    /**
     * 电表进行远程身份认证
     *
     * @param meterAddress 表地址
     * @param keyType      密钥类型 00公钥 01私钥
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:rand2 执行远程身份认证之后获取的电表随机数2
     * 1:esamNo 执行身份认证之后获取的电表ESAM编号
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult remoteIdentity(String meterAddress, String keyType, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("keyType", keyType);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit1Complex_remoteIdentity", jb.toString());
    }

    /**
     * 打开红外或串口
     *
     * @param mode 通信方式 0 默认普通红外 1串口 2普通红外 3 激光红外
     * @return 0成功 其他失败
     */
    public ReturnResult onInfraInit(int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", mode);
            //插件需要 key =mode   而极速版是 key = data
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit1Complex_onInfraInit", jb.toString());
    }

    /**
     * 关闭红外或串口
     *
     * @param mode 通信方式 0 默认普通红外 1串口 2普通红外 3 激光红外
     * @return 0成功 其他失败
     */
    public ReturnResult onInfraDeInit(int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", mode);
            //插件需要 key =mode   而极速版是 key = data
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit1Complex_onInfraDeInit", jb.toString());
    }

    /**
     * 设置通信超时时间，如何串口已经打开，则改变为关闭状态，需要重新打开后生效
     *
     * @param sendTimeOut    发送超时时间 毫秒
     * @param receiveTimeOut 接收超时时间 毫秒
     */
    public void setInfraTimeOut(int sendTimeOut, int receiveTimeOut) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("sendTimeOut", sendTimeOut);
            jb.put("receiveTimeOut", receiveTimeOut);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        HardWareUtil.requestHardwareData("unit1Complex_setInfraTimeOut", jb.toString());
    }


    /**
     * 电表进行红外身份认证（使用之前先进行调用meterRegisterAuthInfo注册红外相关权限）
     *
     * @param meterAddress 表地址
     * @param keyType      密钥类型 00公钥 01私钥
     * @param mode         类型
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult infraIdentityV1(String meterAddress, String keyType, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("keyType", keyType);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit1Complex_infraIdentityV1", jb.toString());
    }

    public ReturnResult sendRecordData698V1(String meterAddress, String taskData, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("checkDar", checkDar);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit1Complex_sendRecordData698V1", jb.toString());
    }

    public ReturnResult sendRecordData698ForFrameDataV1(String meterAddress, String taskData, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit1Complex_sendRecordData698ForFrameDataV1", jb.toString());
    }

}
